Karol Doliński

I. Wprowadzenie

Celem pracy jest dokonanie analizy polskiej giełdy i weryfikacja hipotezy, czy poszczególne indeksy branżowe notowane na polskiej giełdzie zależą tylko od rynku czy wpływają na nie również inne cechy.

Dane zostały pobrane w dniu 29.10.2021 roku ze strony Stooq i dotyczą okresu od marca 2009 roku do września 2021 roku. Zbiór danych dotyczy wartości zamknięcia dla indeksów (w ujęciu miesięcznym):

  1. WIG-Banki
  2. WIG-Budownictwo
  3. WIG-Chemia
  4. WIG-Informatyka
  5. WIG-Media
  6. WIG-Nieruchomości
  7. WIG-Paliwa
  8. WIG-Spożywczy
  9. WIG-Telekomunikacja
  10. WIG
wig_m <- read.csv('wig_m.csv')
wig_banki <- read.csv('wig_banki_m.csv')
wig_budow <- read.csv('wig_budow_m.csv')
wig_chemia <- read.csv('wig_chemia_m.csv')
wig_info <- read.csv('wig_info_m.csv')
wig_media <- read.csv('wig_media_m.csv')
wig_nrchom <- read.csv('wig_nrchom_m.csv')
wig_paliwa <- read.csv('wig_paliwa_m.csv')
wig_spozyw <- read.csv('wig_spozyw_m.csv')
wig_telkom <- read.csv('wig_telkom_m.csv')

data <- as.Date(wig_banki$Data)

wig <- as.data.frame(cbind(wig_banki$Data, wig_m$Zamkniecie,  wig_banki$Zamkniecie, wig_budow$Zamkniecie,
                           wig_chemia$Zamkniecie, wig_info$Zamkniecie, wig_media$Zamkniecie, 
                           wig_nrchom$Zamkniecie, wig_paliwa$Zamkniecie, wig_spozyw$Zamkniecie,
                           wig_telkom$Zamkniecie))
wig$V1 <- as.Date(wig_banki$Data)

colnames(wig) <- c('Data', 'wig', 'wig_banki', 'wig_budow', 'wig_chemia', 'wig_info', 'wig_media',
                   'wig_nrchom', 'wig_paliwa', 'wig_spozyw', 'wig_telkom')

# Dane z okresu 03.2009 do 09.2021
dane <- wig[51:201,]

II. Wybrane metody i analiza empiryczna

Rozdział został poświęcony omówieniu wykorzystanych metod oraz przeprowadzeniu analizy empirycznej.


Stopy zwrotu

T <- nrow(dane) - 1                  
N <- ncol(dane) - 2                   
K <- 1                      
stopa_wolna_od_ryzyka <- 0.01/12

stopa_prosta <- as.data.frame(matrix(data = NA, nrow = nrow(dane)-1, ncol(dane)-1))

for (i in 2 : ncol(dane))
{
  for (j in 2 : nrow(dane))
  {
    stopa_prosta[j-1, i-1] <- (dane[j,i] - dane[j-1,i])/dane[j-1,i] - stopa_wolna_od_ryzyka
  }
}

stats <- describe(stopa_prosta)
stopa_prosta_stat <- stats[,3:5]
rownames(stopa_prosta_stat) <- c('wig', 'wig_banki', 'wig_budow', 'wig_chemia', 'wig_info', 'wig_media',
                                 'wig_nrchom', 'wig_paliwa', 'wig_spozyw', 'wig_telkom')
colnames(stopa_prosta_stat) <- c('Średnia', 'Odchylenie standardowe', 'Mediana')
kbl(stopa_prosta_stat) %>% 
  footnote(general = "Wybrane statystyki opisowe", general_title = "Tabela 1: ", footnote_as_chunk = T) %>%
  kable_styling(bootstrap_options = "striped", full_width = F, position = "float_right")
Średnia Odchylenie standardowe Mediana
wig 0.0076667 0.0519316 0.0040155
wig_banki 0.0087354 0.0774062 -0.0001354
wig_budow 0.0023051 0.0763852 -0.0053675
wig_chemia 0.0117173 0.0810652 0.0035270
wig_info 0.0115140 0.0511910 0.0080527
wig_media 0.0103496 0.0595655 0.0097523
wig_nrchom 0.0062989 0.0637579 0.0060606
wig_paliwa 0.0109265 0.0751327 0.0129979
wig_spozyw 0.0093334 0.0673888 0.0030228
wig_telkom 0.0018307 0.0631702 0.0055665
Tabela 1: Wybrane statystyki opisowe

Stopa zwrotu jest wskaźnikiem finansowym, miarą ryzyka danego przedsięwzięcia czy inwestycji. Prosta stopa zwrotu mu postać:

\[R_{t} = \frac{P_t - P_{t-1}}{P_{t-1}}\]

\(R_{t}\) - prosta stopa zwrotu
\(P_{t}\) - wartość zamknięcia indeksu w czasie t
\(P_{t-1}\) - wartość zamknięcia indeksu w czasie t-1


W Tabeli 1 przedstawiono wybrane statystyki opisowe analizowanych indeksów. Średnia miesięczna stopa zwrotu waha się od 0,18% dla WIG-Telekomunikacja do 1,17% dla WIG-Chemia. Z uwagi na to, można stwierdzić, iż inwestycje w badanych branżach przynoszą zysk. Warto zaznaczyć stosunkowo duże odchylenie standardowe. Natomiast mediana przyjmuje wartości od -0,53% do 1,29%. Średnia nie jest bardzo bliska średniej, co może wskazywać na asymetrię próby.


wykres_p <- cbind(dane[2:151,1], stopa_prosta)
colnames(wykres_p) <- colnames(dane)

wykres <- melt.data.frame(wykres_p, id=c('Data'))
colnames(wykres) <- c("Data", "Indeks", "Wartosc")
wykres$Wartosc <- round(wykres$Wartosc, 3)
wykres$Data <- as.yearmon(wykres$Data)

p1<-wykres %>%
  ggplot(aes(x=Data, y=Wartosc, color=Indeks)) +
  geom_line(alpha=0.7) +
  geom_point(size=.9)+
  theme_bw() +
  geom_hline(yintercept=0, linetype="solid", color = "black", alpha=0.5) +
  labs(y = "Wartość prostej stopy zwrotu", x="Lata", title = "Wartości prostych stóp zwrotu dla wybranych indeksów") 
ggplotly(p1) %>% rangeslider(start = wykres$Data[1], end = wykres$Data[150]) %>%
  layout(autosize = T)

Model CAPM (Capital asset pricing model)

Wycena instrumentów finansowych może być dokonana za pomocą jednoczynnikowego modelu CAPM (Capital Asset Pricing Model). Postać tego modelu jest następująca:

\[R_{it} - r_{ft} = \alpha_{i} + \beta_{i}(R_{Mt} - r_{ft}) + \varepsilon_{it}\]

\(R_{it}\) - stopa zwrotu i-tego portfela w czasie t

\(r_{ft}\) - stopa zwrotu wolna od ryzyka

\(R_{Mt}\) - stopa zwrotu portfela rynkowego

\(\alpha_{i}\), \(\beta_{i}\) - parametry strukturalne modelu

\(\varepsilon_{it}\) - zakłócenia losowe


Po oddzielnym oszacowaniu dziewięciu modeli za pomocą metody najmniejszych kwadratów okazuje się, iż macierz wariancji-kowariancji reszt nie jest diagonalna, a co za tym idzie, reszty z poszczególnych modeli są ze sobą skorelowane.

Właściwa więc wydaje się łączna estymacja modeli, ponieważ może być bardziej efektywna niż estymacja pojedyncza. Model pozornie niezależnych regresji SUR (ang. Seemingly Unrelated Regressions) umożliwia taką estymację z wykorzystaniem uogólnionej metody najmniejszych kwadratów.

Należy zauważyć, iż model CAPM jest przypadkiem szczególnym, ponieważ zmienną objaśniająca w każdym równaniu jest ta sama zmienna (w omawianej pracy zmienna WIG). W takiej sytuacji metoda SUR jest tak samo efektywna jak estymacja każdego równania z osobna metodą najmniejszych kwadratów. Obie metody dają takie same oszacowania estymatorów.

Z uwagi na powyższe w pracy dokonano dziewięciu oddzielnych oszacowań estymatorów (dla każdego równania z osobna).


Macierz wariancji-kowariancji reszt

alpha <- as.data.frame(matrix(data = NA, nrow = 2, ncol = ncol(stopa_prosta)-1))
alpha_pvalue <- as.data.frame(matrix(data = NA, nrow = 1, ncol = ncol(stopa_prosta)-1))
reszty <- as.data.frame(matrix(data = NA, nrow = nrow(stopa_prosta), ncol = ncol(stopa_prosta)-1))

for (k in 2:ncol(stopa_prosta))
{
  model <- lm(stopa_prosta[,k] ~ stopa_prosta[,1])
  reszty[,k-1] <- model$residuals
  alpha[,k-1] <- model$coefficients
  alpha_pvalue[,k-1] <- summary(model)$coefficient[1,4]
}

cov_reszty <- cov(reszty)
sigma_odwrotna <- as.matrix(solve(cov(reszty)))
alpha <- as.matrix(alpha)
alpha_t <- as.matrix(t(alpha))

GRS = (T/N) * ((T-N-K)/(T-K-1) * (alpha[1,] %*% sigma_odwrotna %*% alpha_t[,1]) / 
                 (1 + mean(stopa_prosta[,1])^2 / var(stopa_prosta[,1])))

rownames(cov_reszty) <- colnames(cov_reszty) <- c('WIG-Banki', 'WIG-Budownictwo', 'WIG-Chemia', 'WIG-Informatyka', 'WIG-Media', 'WIG-Nieruchomości', 'WIG-Paliwa', 'WIG-Spożywczy', 'WIG-Telekomunikacja')
kbl(cov_reszty) %>%
  kable_styling(bootstrap_options = c("striped"))
WIG-Banki WIG-Budownictwo WIG-Chemia WIG-Informatyka WIG-Media WIG-Nieruchomości WIG-Paliwa WIG-Spożywczy WIG-Telekomunikacja
WIG-Banki 0.0014312 -0.0004647 -0.0008587 -0.0004609 0.0000527 -0.0000617 -0.0002474 -0.0000285 -0.0004912
WIG-Budownictwo -0.0004647 0.0036536 0.0003253 0.0009676 0.0009192 0.0009564 -0.0007893 0.0003696 0.0002647
WIG-Chemia -0.0008587 0.0003253 0.0041237 0.0000550 0.0000613 0.0000562 0.0003865 0.0004522 0.0002343
WIG-Informatyka -0.0004609 0.0009676 0.0000550 0.0016075 0.0003102 0.0002911 -0.0004465 0.0002613 0.0002129
WIG-Media 0.0000527 0.0009192 0.0000613 0.0003102 0.0018587 0.0004013 -0.0007805 0.0003796 0.0001273
WIG-Nieruchomości -0.0000617 0.0009564 0.0000562 0.0002911 0.0004013 0.0017063 -0.0005338 0.0003483 -0.0001366
WIG-Paliwa -0.0002474 -0.0007893 0.0003865 -0.0004465 -0.0007805 -0.0005338 0.0026226 -0.0004353 -0.0008476
WIG-Spożywczy -0.0000285 0.0003696 0.0004522 0.0002613 0.0003796 0.0003483 -0.0004353 0.0028155 -0.0004734
WIG-Telekomunikacja -0.0004912 0.0002647 0.0002343 0.0002129 0.0001273 -0.0001366 -0.0008476 -0.0004734 0.0034776

Paramtry strukturalne modeli

tab <- as.data.frame(rbind(alpha, alpha_pvalue))
rownames(tab) <- c("Alfa", "Beta", "Wartość p-value dla testu istotności parametru Alfa")
colnames(tab) <- c('WIG-Banki', 'WIG-Budownictwo', 'WIG-Chemia', 'WIG-Informatyka', 'WIG-Media', 
  'WIG-Nieruchomości', 'WIG-Paliwa', 'WIG-Spożywczy', 'WIG-Telekomunikacja')

kbl(t(tab), col.names = c("$\\alpha_i$", "$\\beta_i$", 
                          "Wartość p-value dla testu istotności parametru $\\alpha_i$")) %>%
  kable_styling(bootstrap_options = c("striped", "hover"))
\(\alpha_i\) \(\beta_i\) Wartość p-value dla testu istotności parametru \(\alpha_i\)
WIG-Banki -0.0012343 1.3003918 0.6941771
WIG-Budownictwo -0.0045897 0.8993128 0.3607096
WIG-Chemia 0.0044131 0.9527159 0.4079952
WIG-Informatyka 0.0068151 0.6128936 0.0418868
WIG-Media 0.0042816 0.7914637 0.2323815
WIG-Nieruchomości -0.0008712 0.9352197 0.7993373
WIG-Paliwa 0.0028103 1.0586197 0.5086074
WIG-Spożywczy 0.0032004 0.7999485 0.4675915
WIG-Telekomunikacja -0.0015126 0.4360805 0.7572187
#GRS
#qf(0.95,N,T-N-K)


Test GRS

Test GRS umożliwia weryfikację, czy wektor \(\alpha\) jest istotny. Jeśli nie jest istotny, to znaczy, że ryzko dla poszczególnych portfeli zależy tylko od rynku.

Hipotezy testu GRS mają postać:

\(H_0:\alpha=0\)

\(H_1:\alpha\neq0\)

Statystykę GRS oblicza się według poniższego wzoru:

\[GRS=(\frac{T}{N})(\frac{T-N-K}{T-K-1})(\frac{\hat\alpha^{T}\Sigma^{-1}\hat\alpha}{1+\hat\mu^{T}\hat V^{-1}\hat\mu})\] gdzie:

\(T\) - liczba obserwacji

\(N\) - liczba portfeli

\(K\) - liczba czynników

\(\hat\alpha\) - wektor wyrazów wolnych

\(\hat\Sigma\) - macierz wariancji-kowariancji reszt

\(\hat\mu\) - średnia czynnika WIG

\(\hat V\) - wariancja czynnika WIG



III. Podsumowanie

Wartość statystyki GRS jest równa około 1.34. Natomiast wartość krytyczna F o N st. swobody licznika i T-N-K st. swobody mianownika jest równa w przybliżeniu 1.95 (dla przyjętego poziomu istotności: 5%). Z uwagi na to, że wartość statystyki GRS jest mniejsza niż wartość krytyczna F, to brak jest podstaw od odrzucenia hipotezy głównej. Wektor parametrów \(\alpha_{i}\) jest nieistotny. Gdyby przyjąć inny, mniejszy niż 5% poziom istotności, to wartość statystyki F byłaby większa niż 1.95, dlatego wniosek byłby taki sam - nieistotność wektora parametrów \(\alpha_{i}\).

Zerowa wartość wyrazów wolnych pozwala stwierdzić, iż czynnik uzwględniowny w modelu (WIG) jest wystarczający do określania stóp zwrotu portfeli branżowych. Przeprowadzony test GRS pozwala na stwierdzenie, że stopy zwrotu portfeli branżowych zależą tylko od rynku.

Ogromną zaletą testu GRS jest fakt, iż pozwala on na sprawdzanie modelu jako całości, a nie dla jednego portfela branżowego.

Przeprowadzając test istotności stałej dla każdego modelu z osobna dla ośmiu z dziewięciu modelu na poziomie istotności 5% można stwierdzić, iż stała jest nieistotna. Dla WIG-Informatyka p-value jest równe około 0.04, dlatego na poziomie istotności 5% stała ta jest istotna. Gdyby jednak przyjąć inny poziom istotności (np. 1%), to stała byłaby nieistotna w każdym modelu.

Parametr strukturalny \(\beta\) jest większy niż 1 dla WIG-Banki i WIG-Paliwa. Oznacza to, iż są to branże, w które warto inwestować.